package club.xyes.zkh.ecommerce.service;

import club.xyes.zkh.ecommerce.commons.dto.DatetimeRange;
import club.xyes.zkh.ecommerce.commons.entity.*;
import club.xyes.zkh.ecommerce.commons.vo.TransactionLogOverview;
import club.xyes.zkh.ecommerce.commons.vo.payment.PrePayResultVo;
import club.xyes.zkh.ecommerce.service.adapter.TransactionLogSingleDependencyMapperAdapter;
import club.xyes.zkh.ecommerce.service.listener.OnPaymentSuccessListener;
import club.xyes.zkh.ecommerce.wechat.dto.SaoBeiNotifyVo;
import club.xyes.zkh.ecommerce.wechat.dto.SaoBeiPayResult;
import com.github.pagehelper.PageInfo;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * Create by 郭文梁 2019/4/19 0019 18:19
 * TransactionLogService
 * 交易记录相关业务行为定义
 *
 * @author 郭文梁
 * @data 2019/4/19 0019
 */
public interface TransactionLogService extends BaseService<TransactionLog>, TransactionLogSingleDependencyMapperAdapter {
    /**
     * 通过用户ID查询交易记录
     *
     * @param userId 用户ID
     * @param page   页码
     * @param rows   每页大小
     * @return PageInfo
     */
    PageInfo<TransactionLog> findByUserId(Integer userId, Integer page, Integer rows);

    /**
     * 查询商铺的交易概览信息
     *
     * @param shop  商铺对象
     * @param range 时间区间
     * @return Map
     */
    Map<String, Object> overview(Shop shop, DatetimeRange range);

    /**
     * 发起微信预支付
     *
     * @param user 用户
     * @param shop 商铺
     * @param fee  支付金额
     * @return {log:TransactionLog Entity, additional: SaoBeiPayResult vo}
     * @throws Exception 异常
     */
    PrePayResultVo<SaoBeiPayResult> prePay(User user, Shop shop, int fee) throws Exception;

    /**
     * 使用会员和优惠券支付
     *
     * @param user               用户
     * @param shop               商铺
     * @param totalFee           总金额
     * @param noDiscountAmount   不参与优惠金额
     * @param userCoupon         用户优惠券
     * @param couponDiscount     优惠券优惠金额
     * @param membership         用户会员
     * @param membershipDiscount 会员优惠金额
     * @return {log:TransactionLog Entity, additional: SaoBeiPayResult vo}
     * @throws Exception 异常
     */
    PrePayResultVo<SaoBeiPayResult> preferentialPay(User user, Shop shop, int totalFee, int noDiscountAmount,
                                                    UserCoupon userCoupon, int couponDiscount,
                                                    UserMembership membership, int membershipDiscount) throws Exception;


    /**
     * 刷新交易状态
     *
     * @param log                      记录对象
     * @param onPaymentSuccessListener 支付成功回调
     * @param shop                     Shop
     * @param context                  数据保存上下文
     * @return 交易记录
     * @throws Exception 异常
     */
    TransactionLog refreshStatus(TransactionLog log,
                                 Shop shop,
                                 OnPaymentSuccessListener onPaymentSuccessListener,
                                 Map<String, Object> context) throws Exception;

    /**
     * 根据ShopId查询交易记录
     *
     * @param shopId 商铺ID
     * @param page   页码
     * @param rows   每页大小
     * @return GR
     */
    PageInfo<TransactionLog> findByShopId(Integer shopId, Integer page, Integer rows);

    /**
     * 通过消费金额查询用户在店铺的消费记录
     *
     * @param shopId 商铺ID
     * @param amount 消费金额
     * @return 消费记录
     */
    List<TransactionLog> searchByAmount(Integer shopId, Integer amount);

    /**
     * 通过消费金额查询用户在店铺的消费记录
     *
     * @param page   页码
     * @param rows   每页大小
     * @param shopId 商铺ID
     * @param amount 消费金额
     * @return 消费记录
     */
    PageInfo<TransactionLog> searchByAmount(Integer shopId, Integer amount, Integer page, Integer rows);

    /**
     * 通过用户和商铺查询概览信息
     *
     * @param shopId 商铺ID
     * @param userId 用户ID
     * @return 概览信息
     */
    TransactionLogOverview overviewByShopAndUser(Integer shopId, Integer userId);

    /**
     * 通过用户ID和商铺Id查询交易记录
     *
     * @param userId 用户ID
     * @param shopId 商铺ID】
     * @param rows   每页大小
     * @param page   页码
     * @return 交易记录
     */
    PageInfo<TransactionLog> findByUserAndShop(Integer userId, Integer shopId, int page, int rows);

    /**
     * 退款
     *
     * @param log  交易记录
     * @param shop Shop
     * @return 退款结果
     * @throws IOException IO异常
     */
    TransactionLog refund(TransactionLog log, Shop shop) throws IOException;

    /**
     * 通过商户订单号查询交易记录
     *
     * @param outTradeNo 商户订单号
     * @return Log
     */
    TransactionLog findByOutTradeNo(String outTradeNo);

    /**
     * 处理扫呗交易通知
     *
     * @param notifyVo 通知数据
     * @return 原样返回给扫呗
     */
    Map<String, Object> onNotify(SaoBeiNotifyVo notifyVo);
}
